/**
 * 网络请求工具封装
 */

const config = require('./config.js');

// API基础地址，从配置文件获取
const API_BASE_URL = config.API_BASE_URL + '/miniapp';

// 不需要登录就可以访问的公共API列表
const PUBLIC_APIS = [
  '/banners',
  '/products/recommend',
  '/products/list',
  '/products/detail',
  '/categories'
];

// 判断是否是公共API
function isPublicApi(url) {
  return PUBLIC_APIS.some(api => url.indexOf(api) !== -1);
}

/**
 * 统一请求函数
 * @param {Object} options 请求配置
 * @returns {Promise}
 */
function request(options) {
  const { url, data, method = 'GET', loading = true, showError = true } = options;
  
  // 完整的请求地址
  const fullUrl = url.startsWith('http') ? url : API_BASE_URL + url;
  
  console.log('【网络请求】', method, fullUrl, '请求参数:', data);
  
  // 是否显示loading
  if (loading) {
    wx.showLoading({
      title: '加载中...',
      mask: true
    });
  }
  
  // 获取token
  const token = wx.getStorageSync('token');
  console.log('【网络请求】当前token:', token);
  
  // 请求头
  const header = {
    'Content-Type': 'application/json'
  };
  
  // 如果不是公共API且有token，则添加token到请求头
  if (!isPublicApi(url) && token) {
    header['Authorization'] = `Bearer ${token}`;
  }
  
  console.log('【网络请求】请求头:', header);
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: fullUrl,
      data: data,
      method: method,
      header: header,
      success: function(res) {
        if (loading) {
          wx.hideLoading();
        }
        
        console.log(`【网络请求响应】${method} ${fullUrl} 状态码:`, res.statusCode);
        console.log('【网络请求响应】详细数据:', res.data);
        
        // 判断请求是否成功
        if (res.statusCode === 200) {
          resolve(res.data);
        } else if (res.statusCode === 401) {
          // 未授权，需要登录
          console.error('【网络请求错误】未授权，需要登录');
          if (showError) {
            wx.showToast({
              title: '请先登录',
              icon: 'none'
            });
          }
          wx.removeStorageSync('token');
          reject({ errMsg: 'request:fail', statusCode: res.statusCode });
        } else {
          // 其他错误
          console.error(`【网络请求错误】状态码: ${res.statusCode}, 消息:`, res.data?.message || '请求失败');
          if (showError) {
            wx.showToast({
              title: res.data?.message || '请求失败',
              icon: 'none'
            });
          }
          reject({ errMsg: 'request:fail', statusCode: res.statusCode, data: res.data });
        }
      },
      fail: function(err) {
        if (loading) {
          wx.hideLoading();
        }
        console.error('【网络请求失败】', method, fullUrl, err);
        if (showError) {
          wx.showToast({
            title: '网络错误',
            icon: 'none'
          });
        }
        reject({ errMsg: 'request:fail', error: err });
      }
    });
  });
}

module.exports = {
  request
}; 